package main

import (
	"context"
	"fmt"
	"go-learn/model/pb"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
	"google.golang.org/grpc/reflection"
	"net"
)

type server struct{}

func (s *server) Search(ctx context.Context, request *pb.SearchRequest) (*pb.SearchResponse, error) {
	fmt.Println("server被调用了！！！")
	// 获取请求头（实际是一个map集合）
	md, ok := metadata.FromIncomingContext(ctx)
	if ok {
		fmt.Println(md)
	}
	// 模拟数据
	var people pb.People
	switch request.Id {
	case 1:
		people = pb.People{Name: "张三", Male: true, Scores: 60}
	case 2:
		people = pb.People{Name: "李四", Male: true, Scores: 80}
	case 3:
		people = pb.People{Name: "王五", Male: true, Scores: 100}
	default:
		return &pb.SearchResponse{Status: 400, Data: nil, Msg: "操作失败"}, nil
	}
	return &pb.SearchResponse{Status: 200, Data: &people, Msg: "操作成功"}, nil
}

func main() {
	// 监听本地8000端口
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Printf("监听失败: %v", err)
		return
	}
	// 创建grpc服务器
	s := grpc.NewServer()
	// 注册服务
	pb.RegisterSearchServiceServer(s, &server{})
	// 在给定的gRPC服务器上注册服务器反射服务
	reflection.Register(s)
	// Serve方法在lis上接受传入连接，为每个连接创建一个ServerTransport和server的goroutine。
	// 该goroutine读取gRPC请求，然后调用已注册的处理程序来响应它们。
	if err := s.Serve(listen); err != nil {
		fmt.Printf("请求失败: %v", err)
		return
	}
}
